<?php

namespace Inscripcion\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Inscripcion\Model\Entity\PensumCursar;
use Inscripcion\Controller\Service\GenericService;
use Inscripcion\Model\Dao\PensumCursarDao;
use Maestros\Controller\Service\PensumService;
use Maestros\Controller\Service\MateriaService;
use Transaccion\Controller\Service\OrganizacionSeccionService;
use Maestros\Controller\Service\TurnoService;

class PensumCursarService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $pensumCursarService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$pensumCursarService == null) {
            self::$pensumCursarService = new PensumCursarService($adapter);
        }
        return self::$pensumCursarService;
    }

    public function getPensumCursarDao() {
        return PensumCursarDao::getInstance($this->dbAdapter);
    }

    public function getRegistro($id) {
        $data = null;
        $success = false;
        $pensumCursar = $this->obtenerPensumCursarSegunId($id);
        if ($pensumCursar->getId() != null) {
            $data[0] = $pensumCursar->objectToArray();
            ;
            $success = true;
            $mensaje = 'PensumCursar Encontrada';
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data)
        );
        return $output;
    }

    public function getPensumCursar($idDatoIngreso) {
        $data = null;
        $success = true;
        $PensumCursar = $this->obtenerPensumCursarSegunDatoIngreso($idDatoIngreso);
        $servicioPensum = PensumService::getInstance($this->dbAdapter);
        $servicioMateria = MateriaService::getInstance($this->dbAdapter);
        foreach ($PensumCursar as $row) {
            $pensumCursar[] = array(
                'idpensum' => $row['id_pensum'],
            );
        }

        for ($i = 0; $i < count($pensumCursar); $i++) {
            $idPensum = $pensumCursar[$i]['idpensum'];
            $pensum = $servicioPensum->obtenerPensumSegunId($idPensum);
            $materiasCursar = $pensum->objectToArray();
            $materiasBuscar[$i]['materia'] = $materiasCursar['_materia'];
            $materiasBuscar[$i]['pensum'] = $pensumCursar[$i]['idpensum'];
        }

        for ($i = 0; $i < count($materiasBuscar); $i++) {
            $materia = $materiasBuscar[$i]['materia'];
            $pensum = $materiasBuscar[$i]['pensum'];
            $materia = $servicioMateria->getRegistroCompletoDeMateria($materia, $pensum);
            $data[] = $materia['data'];
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($materiasCursar)
        );
        return $output;
    }

    public function getSeccionesDisponiblesSegunPensumLapso($idPensum, $lapso) {
        $data = null;
        $success = true;
        $organizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $secciones = $organizacionSeccion->getSeccionesDisponiblesSegunPensumLapso($idPensum, $lapso);
        $servicioTurno = TurnoService::getInstance($this->dbAdapter);
        for ($i = 0; $i < count($secciones); $i++) {
            $id = $secciones[$i]['idturno'];
            $turno = $servicioTurno->getRegistro($id);
            $turnoseccion = $turno['data'][0]['descripcion'];
            $secciones[$i]['idturno'] = $turnoseccion;
        }
        $output = array(
            'success' => $success,
            'data' => $secciones,
            'total' => count($secciones)
        );
        return $output;
    }

    public function obtenerPensumCursarSegunDatoIngreso($idDatoIngreso) {
        $registros = $this->getPensumCursarDao()->getPensumCursarSegunIdDatosIngreso($idDatoIngreso);
        return $registros;
    }

    //------Retornan los objetos-------

    /**
     * Retorna un registro completo dado un id de malla de la tabla malla
     * @param $id type string
     * @return Objeto malla
     */
    public function obtenerPensumCursarSegunId($id) {
        $registros = $this->getPensumCursarDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $pensumCursar = new PensumCursar($data[0]);
        $pensumCursar->setId($data[0]['id']);
        $pensumCursar->setdatosIngreso($data[0]['cedula']);
        $pensumCursar->setpensum($data[0]['id_pensum']);
        return $pensumCursar;
    }

    public function getValidarChoques($cedula, $lapso, $idorganizacionseccionainscribir) {
        $organizacionSeccion = OrganizacionSeccionService::getInstance($this->dbAdapter);
        $servicioMateria = MateriaService::getInstance($this->dbAdapter);
        $Semestre = $servicioMateria->getMateriasInscritasSegunCedulaYLapso($cedula, $lapso);
        $organizacionesdeSemestre = $Semestre['data'];
        $i = 0;
        $choque = false;
        while ((($i < count($organizacionesdeSemestre)) && ($choque == false))) {
            $idOrgSemestre = $organizacionesdeSemestre[$i]['_organizacionseccion'];
            $choque = $organizacionSeccion->getChoqueHorariosSegunIds($idorganizacionseccionainscribir, $idOrgSemestre);
            $i++;
        }
        return $choque;
    }

}
